import { PresetColorEnum } from '@/enums/colorEnum';
import { FilterOperateEnum } from '@/enums/filterOperateEnum';
import { ListSortDirectionEnum } from '@/enums/listSortDirectionEnum';

/** 列标签 */
export interface ColumnTag {
  /**
   * 文本
   */
  text?: string;
  /**
   * 颜色值，支持预设和色值
   * - 预设：geekblue,blue,purple,success,red,volcano,orange,gold,lime,green,cyan
   * - 色值：#f50,#ff0
   */
  color?: PresetColorEnum | string;
}

/** 枚举架构 */
export interface EnumSchema {
  /** 键 */
  [key: string]: any;
  /** 文本 */
  label: string;
  /** 值 */
  value: string | number;
  /** 是否禁用状态 */
  disabled?: boolean;

  /** 是否启用Tag */
  tag?: boolean;
  /** tag颜色值，支持预设和色值
   * - 预设：geekblue,blue,purple,success,red,volcano,orange,gold,lime,green,cyan
   * - 色值：#f50,#ff0
   */
  tagColor?: PresetColorEnum | string;
  /** tag图标 */
  tagIcon?: string;
}

/**  列表节点 */
export interface ListNode {
  /**  编号 */
  id: number;
  /**  名称 */
  text: string;
}

/** 查询条件 */
export class FilterRule {
  /** 属性名 */
  Field?: string;
  /** 属性值 */
  Value: any;
  /** 对比操作 */
  Operate?: FilterOperateEnum;

  /** 是否将属性名称驼峰(lowerCase)写法转换为帕斯卡(UpperCase)写法 */
  IsLowerCaseToUpperCase?: boolean;

  /** 非外键关联查询的实体类型 */
  JoinEntityType?: string;
  /** 非外键关联查询的过滤字段名 */
  JoinFilterField?: string;
  /** 非外键关联查询的选择字段名 */
  JoinSelectField?: string;

  /**
   * 实例化一个条件信息
   * @param field 字段名
   * @param value 属性值
   * @param operate 对比操作
   */
  constructor(
    field: string | undefined,
    value: any,
    operate: FilterOperateEnum | undefined = undefined,
  ) {
    this.Field = field;
    this.Value = value;
    this.Operate = operate;
  }
  [key: string]: any;
}
/**  查询条件组 */
export class FilterGroup {
  /** 条件集合 */
  Rules: FilterRule[] = [];
  /** 条件间操作 */
  Operate: FilterOperateEnum = FilterOperateEnum.And;
  /** 条件组集合 */
  Groups: FilterGroup[] = [];
  /**  Level */
  Level = 1;

  /** 初始化 */
  static Init(group: FilterGroup) {
    if (!group.Level) {
      group.Level = 1;
    }
    group.Groups.forEach((subGroup) => {
      subGroup.Level = group.Level + 1;
      FilterGroup.Init(subGroup);
    });
  }
}

/**  排序条件 */
export class SortCondition {
  /**  排序字段名称 */
  SortField = '';
  /**  排序方向 */
  ListSortDirection: ListSortDirectionEnum = ListSortDirectionEnum.Ascending;
}

/**  分页条件 */
export class PageCondition {
  /**  页序 */
  PageIndex = 1;
  /**  分页大小 */
  PageSize = 20;
  /**  排序条件集合 */
  SortConditions: SortCondition[] = [];
}

/**  分页请求 */
export class PageRequest {
  /**  分页条件信息 */
  PageCondition: PageCondition = new PageCondition();
  /**  查询条件组 */
  FilterGroup: FilterGroup = new FilterGroup();
}
/**  分页数据 */
export interface PageData<T = any> {
  /**  数据行 */
  Rows: T[];
  /**  总记录数 */
  Total: string | bigint;
}
